package com.gary.util;

import cn.hutool.core.util.ObjectUtil;
import com.gary.bean.DataPermissionEntity;
import com.gary.constant.DataPermissionConstant;
import com.gary.page.Page;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

/**
 * @description: 数据权限工具类
 * @author: Homan Liang
 * @time: 2020/5/14 13:48
 */
public class DataPermissionUtils {
    private static final Logger logger = LoggerFactory.getLogger(DataPermissionUtils.class);

    /**
     * 是否需要设置数据权限
     * @param page
     * @param dataPermissionEntity
     * @return
     */
    public static boolean isNeedToSetDataPermission(Page page, DataPermissionEntity dataPermissionEntity){
        return ObjectUtil.isNotNull(page) || ObjectUtil.isNotNull(dataPermissionEntity);
    }

    /**
     * 设置数据权限
     * @param page 分页参数实体
     * @param dataPermissionEntity 非分页参数实体
     * @param mapDataPermissionParam 数据权限拼凑 SQL 参数
     * @param defaultQueryAll 是否默认查询所有数据--没有设置数据权限的情况下
     */
    @SuppressWarnings("unchecked")
    public static void setDataPermissionExtraParam(Page page, DataPermissionEntity dataPermissionEntity
            , Map<String, Object> mapDataPermissionParam, boolean defaultQueryAll){
        // 写入额外参数
        if (ObjectUtil.isNotNull(page)) {
            // 分页的情况
            logger.info("数据权限工具类==setDataPermissionExtraParam==分页处理");
            // 额外参数
            Map<String, Object> extraParam = page.getExtraParam();
            if(ObjectUtil.isNull(extraParam)){
                extraParam = new HashMap<>(3);
            }
            // 设置数据权限
            setDataPermissionExtraParam(mapDataPermissionParam, extraParam, defaultQueryAll);
            if(ObjectUtil.isNotNull(extraParam) && extraParam.size()>0){
                page.setExtraParam(extraParam);
            }
        }else if(ObjectUtil.isNotNull(dataPermissionEntity)){
            // 不分页的情况
            logger.info("数据权限工具类==setDataPermissionExtraParam==不分页处理");
            // 额外参数
            Map<String, Object> extraParam = dataPermissionEntity.getExtraParam();
            if(ObjectUtil.isNull(extraParam)){
                extraParam = new HashMap<>(3);
            }
            // 设置数据权限
            setDataPermissionExtraParam(mapDataPermissionParam, extraParam, defaultQueryAll);
            if(ObjectUtil.isNotNull(extraParam) && extraParam.size()>0){
                dataPermissionEntity.setExtraParam(extraParam);
            }
        }
    }

    /**
     * 设置数据权限
     * @param mapDataPermissionParam 数据权限拼凑 SQL 参数
     * @param extraParam 额外参数
     * @param defaultQueryAll 是否默认查询所有数据--没有设置数据权限的情况下
     */
    private static void setDataPermissionExtraParam(Map<String, Object> mapDataPermissionParam
            , Map<String, Object> extraParam, boolean defaultQueryAll){
        if(ObjectUtil.isNull(extraParam)){
            extraParam = new HashMap<>(1);
        }
        if(ObjectUtil.isNull(mapDataPermissionParam)){
            mapDataPermissionParam = new HashMap<>(3);
        }
        // 是否默认查询所有数据--没有设置数据权限的情况下
        if(!defaultQueryAll){
            logger.info("数据权限工具类==setDataPermissionExtraParam==如果没有设置数据权限，就不允许查看数据");
            // 如果用户有选择“不设置数据权限”的数据权限，就允许看所有数据
            Object notSetPermission = mapDataPermissionParam.get(DataPermissionConstant.DATA_PERMISSION_NOT_SET_PERMISSION);
            defaultQueryAll = ObjectUtil.isNotNull(notSetPermission)
                    && (notSetPermission instanceof Boolean)
                    && ((boolean)notSetPermission);

            mapDataPermissionParam.put(DataPermissionConstant.DATA_PERMISSION_DEFAULT_SHOW_ALL, defaultQueryAll);
        }
        if (mapDataPermissionParam.size()>0) {
            extraParam.put(DataPermissionConstant.MENU_ROLE_DATA_PERMISSION_RELATION, mapDataPermissionParam);
        }
    }
}
